package com.tom.websocket;

import com.tom.websocket.handler.ChatHandler;
import com.tom.websocket.handler.HeartBeatHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import io.netty.handler.timeout.IdleStateHandler;

/**
 * @author zx
 * @date 2024年10月15日 16:40
 */
public class ChatServerInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel channel) throws Exception {
        //通过socketChannel 获取对应的管道
        ChannelPipeline pipeline = channel.pipeline();
        /*
         * 通过管道添加handler
         */
        // HttpServerCodec:netty提供的处理http的编解码器
        //当请求到达服务器端的时候，需要做解码，响应给客户端做编码
        pipeline.addLast("HttpServerCodec",new HttpServerCodec());
        //添加对鞋大数据流的支持
        pipeline.addLast(new ChunkedWriteHandler());

        //几乎在netty编程中,都会使用这个handler
        pipeline.addLast(new HttpObjectAggregator(1024*64));
        //=======================================以上支持http协议=======================================


        //=======================================增加心跳机制的支持start=======================================
        //针对客户端,如果在1分钟时没有向服务器发送读写心跳,则主动断开
        //如果读空闲或者写空间,则不处理
        pipeline.addLast(new IdleStateHandler(
                8,
                10,
                12));

        //自定义空闲状态处理器
        pipeline.addLast(new HeartBeatHandler());

        //=======================================增加心跳机制的支持end=======================================




        //=======================================以下支持websocket 协议.================================

        //websocket服务器处理的协议,用于指定客户端链接访问路由: /ws
        //客户端访问： ws://192.168.1.2:875/ws
        //本handler会帮你处理一些繁重的事情
        //会处理握手动作: handshaking(close, ping, pong) ping + pong = 心跳
        //对于websocket来讲,都是以frames来进行传输,不同的的数据类型对应的frames也不同
        pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));
        pipeline.addLast("chatHandler",new ChatHandler());



    }
}
